package ibxm;
public class Pattern {
        public int num_rows;
       
        private int data_offset, note_index;
        private byte[] pattern_data;
        public Pattern() {
                num_rows = 1;
                set_pattern_data( new byte[ 0 ] );
        }
       
        public void set_pattern_data( byte[] data ) {
                if( data != null ) {
                        pattern_data = data;
                }
                data_offset = 0;
                note_index = 0;
        }
        public void get_note( int[] note, int index ) {
                if( index < note_index ) {
                        note_index = 0;
                        data_offset = 0;
                }
                while( note_index <= index ) {
                        data_offset = next_note( data_offset, note );
                        note_index += 1;
                }
        }
        public int next_note( int data_offset, int[] note ) {
                int bitmask, field;
                if( data_offset < 0 ) {
                        data_offset = pattern_data.length;
                }
                bitmask = 0x80;
                if( data_offset < pattern_data.length ) {
                        bitmask = pattern_data[ data_offset ] & 0xFF;
                }
                if( ( bitmask & 0x80 ) == 0x80 ) {
                        data_offset += 1;
                } else {
                        bitmask = 0x1F;
                }
                for( field = 0; field < 5; field++ ) {
                        note[ field ] = 0;
                        if( ( bitmask & 0x01 ) == 0x01 ) {
                                if( data_offset < pattern_data.length ) {
                                        note[ field ] = pattern_data[ data_offset ] & 0xFF;
                                        data_offset += 1;
                                }
                        }
                        bitmask = bitmask >> 1;
                }
                return data_offset;
        }
}